\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{mar. mai 4 01:59:21 CEST 2010}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={MySQL - gestion du cache},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Gestion du cache MySQL},
CreationDate={D:20100504015921},
ModDate={D:20100504015921},
Keywords={mysql;db;databases}
}}
\begin{document}
 
\begin{center}
{\Huge MySQL - gestion du cache }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Gestion du cache MySQL}
 
\vspace{10mm}
 
\hspace{1mm}  C'est une méthode rapide pour lancer un second serveur pour le tester. Le plus agréable de cette méthode est que les variables d'environnement vont être adoptées par les logiciels clients que vous invoquerez avec le même Shell. Par conséquent, les connexions seront automatiquement dirigées vers le nouveau serveur. Pour les scripts de démarrage, la commande doit être :
\vspace{5mm} \\
\hspace{1mm}  \textbf{mysqld\_safe --defaults-file=path-to-option-file}
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Cache de requêtes MySQL }
 
\
 
\hspace{1mm}  MySQL server bénéficie d'un cache de requêtes. En fait, le cache sauvegarde le texte d'une requête SELECT avec le résultat qui a été envoyé au client. Si une requête identique est appelée par la suite, le serveur retournera le résultat à partir du cache plutôt que d'analyser puis exécuter la requête à nouveau.
\vspace{5mm} \\
\hspace{1mm}  Le cache de requêtes est extrêmement utile dans un environnement où les tables ne changent pas souvent, et que vous avez de nombreuses requêtes identiques. C'est la situation classique des serveurs Web, qui génèrent beaucoup de pages dynamiques à partir du même contenu.
\vspace{5mm} \\
\hspace{1mm}  Note : Le cache de requêtes ne retourne pas de données périmées. À chaque fois que les données sont modifiées, les entrées correspondantes dans le cache sont effacées.
\vspace{5mm} \\
 
 
\hspace{1mm}  Si vous ne voulez pas utiliser le cache de requêtes paramétrez \textbf{query\_cache\_size} à zéro. En désactivant le cache de requête, il n'y a aucune surcharge apparente. (le cache de requêtes peut être désactivé à l'aide de l'option de configuration \textbf{--without-query-cache})
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Fonctionnement du cache de requêtes }
 
\
 
\hspace{1mm} Les requêtes sont comparées avant analyse, donc ces 2 requêtes sont considérées comme différentes: \\
\hspace{1mm} \textbf{SELECT * FROM tbl\_name} \\
\hspace{1mm} \textbf{Select * from tbl\_name} \\
 
\hspace{1mm}  Les requêtes qui utilisent différentes bases de données, différents protocoles ou différents jeux de caractères sont alors considérés comme différentes.
\vspace{5mm} \\
\hspace{1mm}  Si un résultat de requête a été retourné depuis le cache de requête, la variable \textbf{Com\_select} ne sera pas incrémenté, mais \textbf{Qchache\_hits} le sera.
\vspace{5mm} \\
\hspace{1mm}  Si une table change, toutes les requêtes mise en cache qui utilisaient cette table sont retirés.
\vspace{5mm} \\
\hspace{1mm}  Une requête ne peut être mise en cache si elle contient l'une des fonctions suivantes:
\vspace{5mm} \\
 
 
{\includegraphics[]{../images/mysql-table7.png}}
 
\hspace{1mm}  Une requête ne sera pas mise en cache dans ces conditions:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} -]{Elle contient des fonctions définies par l'utilisateur : UDF.}
\item[\hspace{1mm} -]{Elle contient des variables utilisateur.}
\item[\hspace{1mm} -]{Elle fait référence à des tables de la base mysql.}
\item[\hspace{1mm} -]{Elle est de l'une des formes suivantes:}
\item[\hspace{1mm} -]{SELECT ... IN SHARE MODE}
\item[\hspace{1mm} -]{SELECT ... INTO OUTFILE ...}
\item[\hspace{1mm} -]{SELECT ... INTO DUMPFILE ...}
\item[\hspace{1mm} -]{SELECT * FROM ... WHERE autoincrement\_col IS NULL}
\item[\hspace{1mm} -]{La dernière forme n'est pas mise en cache, car elle est utilisée comme palliatif pour ODBC, afin d'obtenir la dernière valeur insérée.}
\item[\hspace{1mm} -]{Elle utilise une table TEMPORARY.}
\item[\hspace{1mm} -]{Elle n'utilise pas de tables.}
\item[\hspace{1mm} -]{L'utilisateur a un droit de niveau colonne pour l'une des tables impliquée.}
\item[\hspace{1mm} -]{Avant la lecture de la requête dans le cache de requête, MySQL vérifie que l'utilisateur a les droits SELECT pour toutes les bases de données impliquées. Si ce n'est pas le cas, le résultat n'est pas utilisé.}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} ]{Options relatives au cache de requêtes utilisés dans une requête SELECT}
\item[\hspace{1mm} SQL\_CACHE]{Le résultat de la requête est en cache si la valeur de la variable \textbf{query\_cache} est à \textbf{ON} ou \textbf{DEMAND}}
\item[\hspace{1mm} SQL\_NO\_CACHE]{Le résultat de la requête n'est pas mis en cache}
\end{description}
 
\vspace{1cm}{\huge Exemples }
 
\
 
\hspace{1mm} \textbf{SELECT SQL\_CACHE id, name FROM customer ;} \\
\hspace{1mm} \textbf{SELECT SQL\_NO\_CACHE id, name FROM customer ;} \\
 
\vspace{1cm}{\huge Configuration du cache de requêtes }
 
\
 
\hspace{1mm}  Pour configurer la taille du cache, modifier la variable query\_cache\_size. Une valeur de 0 désactive le cache.
\vspace{5mm} \\
\hspace{1mm}  L'allocation de mémoire pour le cache se fait en bloc à mesure des besoin, c'est couteux en temps, pour définir une taille de bloc modifier \textbf{query\_cache\_min\_res\_unit} (défaut: 4ko). Le nombre de blocks libres et de requêtes supprimées pour libérer de la place sont stockées dans le variables \textbf{Qcache\_free\_blocks} et \textbf{Qcache\_lowmem\_prunes}
\vspace{5mm} \\
\hspace{1mm}  Chaque requête a besoin au minimum de 2 blocs, un pour le texte de la requête et un autre, ou plus, pour le résultat. De même chaque table utilisée par une ou plusieurs requêtes a besoin d'un bloc.
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} ]{query\_cache\_type modifie son comportement:}
\item[\hspace{6mm} 0, OFF]{Empêche la mise en cache ou la lecture de résultat en cache}
\item[\hspace{6mm} 1, ON]{Permet le cache, sauf SELECT SQL\_NO\_CACHE}
\item[\hspace{6mm} 2, DEMAND]{met tout en cache}
\end{description}
 
\hspace{1mm} Pour savoir si le cache est actif: \\
\hspace{1mm} \textbf{SHOW VARIABLES LIKE 'have\_query\_cache' ;} \\
\hspace{1mm} Pour désactiver le cache pour une session \\
\hspace{1mm} \textbf{SET SESSION query\_cache\_type=OFF} \\
\hspace{1mm} Pour défragmenter le cache de requêtes \\
\hspace{1mm} \textbf{FLUSH QUERY CACHE} \\
\hspace{1mm} et \\
\hspace{1mm} \textbf{FLUSH TABLE} \\
\hspace{1mm} Pour visualiser les performances du cache \\
\hspace{1mm} \textbf{SHOW STATUS LIKE 'Qcache\%';} \\
\hspace{1mm} Le nombre total de commandes SELECT vaut \\
\hspace{1mm} \textbf{Com\_select + Qcache\_hits + requêtes avec une erreur} \\
\hspace{1mm} La valeur de Com\_select est \\
\hspace{1mm} \textbf{qcache\_inserts + qcache\_not\_cached + erreurs de droits d'accès ou de colonnes} \\
\end{flushleft}
\end{document}
